package com.mftour.common.utils;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;

public class FtpClientUtil {

	private static FTPClient ftpclient = new FTPClient();

	/**
	 * 上传文件
	 * 
	 * @param host
	 *            ftp地址
	 * @param port
	 *            端口
	 * @param username
	 *            登录名
	 * @param password
	 *            密码
	 * @param dir
	 *            文件目录
	 * @param fileName
	 *            文件名            
	 * @param input
	 *            文件流
	 * @throws Exception
	 */
	public static void sendFile(String host, int port, String username, String password, String dir, String fileName, InputStream input) throws Exception {
		try {
			// 设置服务器名和端口
			ftpclient.connect(host, port);
			int reply = ftpclient.getReplyCode();
			if (!FTPReply.isPositiveCompletion(reply)) {
				throw new Exception("Can't Connect to :" + host);
			}
			// 登录
			if (ftpclient.login(username, password) == false) {
				throw new Exception("Invalid user/password");
			}
			// 设置传送文件模式
			ftpclient.setFileType(FTP.BINARY_FILE_TYPE);
//			String dir = url.substring(0, url.lastIndexOf("/"));// ftp上目录文件夹
//			String fileName = url.substring(url.lastIndexOf("/") + 1);//
			 if (dir != null&&dir.trim().length()>0) {
				if (!isDirExist(dir)) {
					// 该目录不存在,创建该目录
					ftpclient.makeDirectory(dir);
				}
				ftpclient.changeWorkingDirectory(dir);
			}			
			// 传送文件
			ftpclient.storeFile(fileName, input);
		} catch (IOException e) {
			throw e;
		} finally {
			try {
				ftpclient.disconnect(); // 解除连接
			} catch (IOException e) {
			}
		}
	}

	/**
	 * 下载文件
	 * 
	 * @param host
	 *            地址
	 * @param port
	 *            端口
	 * @param username
	 *            登录名
	 * @param password
	 *            登录密码
	 * @param url
	 *            文件绝对路径名称
	 * @param output
	 *            文件流
	 * @throws Exception
	 */
	public static void retrieveFile(String host, int port, String username, String password, String url, OutputStream output) throws Exception {
		try {
			// 设置服务器名和端口
			ftpclient.connect(host, port);
			int reply = ftpclient.getReplyCode();
			if (!FTPReply.isPositiveCompletion(reply)) {
				throw new Exception("Can't Connect to :" + host);
			}
			// 登录
			if (ftpclient.login(username, password) == false) {
				throw new Exception("Invalid user/password");
			}
			// 设置传送模式
			ftpclient.setFileType(FTP.BINARY_FILE_TYPE);
			// 取得文件
			ftpclient.retrieveFile(url, output);
		} catch (IOException e) {
			throw e;
		} finally {
			try {
				ftpclient.disconnect(); // 解除连接
			} catch (IOException e) {
			}
		}
	}

	/**
	 * 判断ftp上某一个目录是否存在
	 * 
	 * @param dir
	 *            目录
	 * @return <b>true</b> if dir exist, and <b>false</b> if dir not exist or
	 *         trigger an exception
	 */
	public static boolean isDirExist(String dir) {
		try {
			if (ftpclient.changeWorkingDirectory(dir)) {
				return true;
			} else {
				return false;
			}
		} catch (Exception e) {
			return false;
		}
	}

	public static void main(String[] args) {
//		String path = GetProperty.GetConfPath(null);
//		String host = GetProperty.readValue(path, "ftpHost");
//		int port = Integer.parseInt(GetProperty.readValue(path, "ftpPort"));
//		String username = GetProperty.readValue(path, "username");
//		String password = GetProperty.readValue(path, "password");
//		try {
//			// 读入文件
//			FileInputStream fis = new FileInputStream("d:\\test.txt");
//			// 传送文件到FTP服务器
//			FtpClientUtil.sendFile(host, port, username, password,null, "remoteFilename", fis);
//
//		} catch (Exception e) {
//		}
	}
}
